import rclpy  # 导入ROS 2 Python客户端库
from rclpy.node import Node  # 从rclpy.node模块导入Node类
from base_interfaces_demo.srv import AddInts  # 导入自定义服务类型AddInts
import sys  # 导入sys模块，用于处理命令行参数

class Client(Node):  # 定义客户端类，继承自Node类

    def __init__(self):  # 初始化方法
        super().__init__("client")  # 调用父类构造函数，初始化节点名称为"client"

        # 创建一个客户端，连接到名为"AddServer"的服务，服务类型为AddInts
        self.cli = self.create_client(AddInts, "AddServer")

        # 等待服务可用，循环等待每秒检查一次
        while not self.cli.wait_for_service(timeout_sec=1.0):
            self.get_logger().info("wait....")  # 如果服务不可用，打印"wait...."
        
        self.req = AddInts.Request()  # 创建一个请求对象

    def send_request(self):  # 发送请求的方法
        print(sys.argv[1], sys.argv[2])  # 打印命令行参数
        self.req.num1 = int(sys.argv[1])  # 将第一个命令行参数转换为整数并赋值给请求的num1字段
        self.req.num2 = int(sys.argv[2])  # 将第二个命令行参数转换为整数并赋值给请求的num2字段
        self.future = self.cli.call_async(self.req)  # 异步发送请求并获取Future对象

def main():  # 主函数
    rclpy.init()  # 初始化rclpy

    client = Client()  # 创建客户端实例
    client.send_request()  # 发送服务请求

    # 等待Future对象完成，即等待服务响应
    rclpy.spin_until_future_complete(client, client.future)

    try:
        res = client.future.result()  # 获取服务响应的结果，如果服务调用未完成，这将阻塞
    except Exception as e:  # 捕获异常
        client.get_logger().info('服务请求失败：%r' % (e,))  # 打印异常信息
    else:
        # 打印服务响应结果
        client.get_logger().info('响应结果：%d + %d = %d' % (client.req.num1, client.req.num2, res.sum))

    rclpy.shutdown()  # 关闭rclpy

if __name__ == '__main__':  # 判断是否为主程序入口
    main()  # 调用主函数
